package com.kaiyufound.asset.allocation.common.config;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.PriorityQueue;

/**
 * @author: lihua
 * @Date: 2024-12-31 13:40
 * @description:
 */
public class SortTool {

    /**
     * 排序方法，传入map和N，由大到小，返回前N个元素
     *
     * @param assertMap
     * @param N
     * @param ascending
     * @return
     */
    private HashMap<String, Double> getTopNFromMap(HashMap<String, Double> assertMap, int N, boolean ascending) {
        // 如果N大于等于原map的大小，直接返回原map副本
        if (N >= assertMap.size()) {
            return new HashMap<>(assertMap);
        }
        //根据传入的排序顺序参数，创建相应排序规则的优先队列
        PriorityQueue<Map.Entry<String, Double>> priorityQueue = new PriorityQueue<>((e1, e2) -> {
            if (ascending) {
                return Double.compare(e1.getValue(), e2.getValue());
            } else {
                return Double.compare(e2.getValue(), e1.getValue());
            }
        });
        // 将原HashMap中的所有元素添加到优先队列中
        for (Map.Entry<String, Double> entry : assertMap.entrySet()) {
            priorityQueue.add(entry);
        }
        // 创建一个LinkedHashMap用于保持插入顺序，最终返回的结果将按顺序存储元素
        LinkedHashMap<String, Double> resultMap = new LinkedHashMap<>();
        for (int i = 0; i < N; i++) {
            if (!priorityQueue.isEmpty()) {
                Map.Entry<String, Double> entry = priorityQueue.poll();
                resultMap.put(entry.getKey(), entry.getValue());
            }
        }
        return resultMap;
    }

}
